package com.cmcc.volte.xdr.util;

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * <b>模块描述	: </b>JSON类型数据处理工具类<br/>
 * <b>使用描述	: </b><br/>
 * <b>JDK版本	: </b>JDK 1.6<br/>
 * <b>作者		: </b>王雷<br/>
 * <b>创建日期	: </b>2014-09-15<br/>
 * <b>创建版本	: </b>v1.0<br/>
 * * …………v1.0<br/>
 * 修改日期	: 2014-09-15<br/>
 * 修改人		: 王雷<br/>
 * 修改原因	: -<br/>
 * 修改说明	: 初始建立<br/>
 * 代码备注	: -<br/>
 * 
 */
public final class JSONUtils {
	
	private static final Logger logger = LogManager.getLogger(JSONUtils.class);
	/**
	 * s_len变量字符串长度
	 */
	private static final int S_LEN = 4;
	
	private JSONUtils(){}
	
	/**
     * @param array
     *            对象数组
     * @return String
     */
    public static String arrayToJSON(Object[] array) {
        StringBuilder json = new StringBuilder();
        json.append("[");
        if (array != null && array.length > 0) {
            for (Object obj : array) {
                json.append(objectToJSON(obj));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, ']');
        } else {
            json.append("]");
        }
        return json.toString();
    }
    
    /**
     * javabean转换成Json字符串
     * @param bean
     *            bean对象
     * @return String
     */
    public static String beanToJSON(Object bean) {
        StringBuilder json = new StringBuilder();
        json.append("{");
        PropertyDescriptor[] props = null;
        try {
            props = Introspector.getBeanInfo(bean.getClass(), Object.class)
                    .getPropertyDescriptors();
        } catch (IntrospectionException e) {
        	logger.error("转换成Json字符错误：",e);
        	e.printStackTrace();
        }
        if (props != null) {
            for (int i = 0; i < props.length; i++) {
                try {
                	 String name = objectToJSON(props[i].getName());
                	 Method method = props[i].getReadMethod();
                	 String value = "";
                	 if(method != null){
                		 value = objectToJSON(props[i].getReadMethod().invoke(bean));
                	 }
                     json.append(name);
                     json.append(":");
                     json.append(value);
                     json.append(",");
                } catch (Exception e) {
                	logger.error("转换成Json字符错误：",e);
                	e.printStackTrace();
                }
            }
            json.setCharAt(json.length() - 1, '}');
        } else {
            json.append("}");
        }
        return json.toString();
    }
    
    /**
     * beanToJsonOnly 获取单条用户信息专用
     * @param root
     * 		  传出JSON的key
     * @param bean
     * 		  javabean对象
     * @return String
     */
    public static String beanToJSONOnly(String root,Object bean) {
        JSONArray jArray = new JSONArray();
        JSONObject jObject = new JSONObject();
        JSONObject jsoObject = new JSONObject();
        PropertyDescriptor[] props = null;
        try {
            props = Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors();
        } catch (IntrospectionException e) {
        	logger.error("获取单条用户信息专用错误：",e);
        	e.printStackTrace();
        }
        if (props != null) {
            for (int i = 0; i < props.length; i++) {
                try {
                	 String name = objectToJSONforbeanToJSONOnly(props[i].getName());
                     String value = objectToJSONforbeanToJSONOnly(props[i].getReadMethod().invoke(bean));
                    
                     jObject.put(name, value);
                } catch (Exception e) {
                	logger.error("获取单条用户信息专用错误：",e);
                	e.printStackTrace();
                }
            }
            jArray.add(jObject);
            jsoObject.put("success", "true");
            jsoObject.put(root, jArray);
        }
        return jsoObject.toString();
    }
    
    /***
     *  bool转换Json字符串
     * @param bool
     * 		  boolean类型
     * @return String
     */
    private static String booleanToJSON(Boolean bool) {
        return bool.toString();
    }
    
    /***
     * 日期转换成"yyyy-MM-dd"形式的字符串
     * @param date 时间类型对象
     * @return String
     */
    private static String dateToJSON(java.util.Date date) {
		String dateFormatString="";
		SimpleDateFormat sdf = null;
		sdf = new SimpleDateFormat("yyyy-MM-dd");
		dateFormatString = sdf.format(date);
		return dateFormatString;
    }
    private static String timeToJSON(java.util.Date date) {
		String dateFormatString="";
		SimpleDateFormat sdf = null;
		sdf = new SimpleDateFormat("HH:mm:ss");
		dateFormatString = sdf.format(date);
		return dateFormatString;
    }
    private static String timestampToJSON(java.util.Date date) {
		String dateFormatString="";
		SimpleDateFormat sdf = null;
		sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		dateFormatString = sdf.format(date);
		return dateFormatString;
    }
    
    /**
     * 返回JSONObject格式的list字符串，包括list的总数和list，
     * 总数的key为property，list的key为root
     * @param root JSON的key
     * @param total list总数
     * @param list
     *            list对象
     *01/11修改为提供总数和根的结构模式
     * @return String
     */
    public static String listToJSON(String root, int total, List<?> list) {
        StringBuilder json = new StringBuilder();
        json.append("{\"property\":"+total+",\""+root+"\":[");
        if (list != null && list.size() > 0) {
            for (Object obj : list) {
                json.append(objectToJSON(obj));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, ']');
        } else {
            json.append("]");
        }
        json.append("}");
        return json.toString();
    }
    
    public static String listToJSON(String root, List<?> list) {
        StringBuilder json = new StringBuilder();
        json.append("{\""+root+"\":[");
        if (list != null && list.size() > 0) {
            for (Object obj : list) {
                json.append(objectToJSON(obj));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, ']');
        } else {
            json.append("]");
        }
        json.append("}");
        return json.toString();
    }
    
    /**
     * 将对象转换成JSONArray字符串
     * @param obj Object
     * @return String
     */
    public static String listToJSON(Object obj){
    	return JSONArray.fromObject(obj).toString();
    }

    /**
     * 将list转换成JSONArray字符串
     * @param list
     *            list对象
     * @return String
     */
    public static String listsToJSON(List<?> list){
        StringBuilder json = new StringBuilder();
        json.append("[");
        if (list != null && list.size() > 0) {
            for (Object obj : list) {
                json.append(objectToJSON(obj));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, ']');
        } else {
            json.append("]");
        }
        return json.toString();
    }
    
    /**
     * @param map
     *            map对象
     * @return String
     */
    public static String mapToJSON(Map<?, ?> map) {
        StringBuilder json = new StringBuilder();
        json.append("{");
        if (map != null && map.size() > 0) {
            for (Object key : map.keySet()) {
            	
            
                json.append(objectToJSON(key));
               
                json.append(":");
                json.append(objectToJSON(map.get(key)));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, '}');
        } else {
            json.append("}");
        }
        return json.toString();
    }

    /***
     * null转换Json字符串
     * @return 空字符串
     */
    public static String nullToJson() {
        return "";
    }
    /***
     * 数字转换成Json字符串
     * @param number Number类型
     * @return String
     */
    public static String numberToJSON(Number number) {
        return number.toString();
    }
    
    /***
     * 对象转换Json字符串
     * @param obj Object对象
     * @return String
     */
    private static String objectToJSON(Object obj) {
        StringBuilder json = new StringBuilder();
        if (obj == null) {
            json.append("\"\"");
        } else if (obj instanceof Number) {
            json.append(numberToJSON((Number) obj));
        } else if (obj instanceof Boolean) {
            json.append(booleanToJSON((Boolean) obj));
        } else if (obj instanceof String) {
            json.append("\"").append(stringToJson(obj.toString())).append("\"");
        } else if (obj instanceof Object[]) {
            json.append(arrayToJSON((Object[]) obj));
        } else if (obj instanceof List) {
            json.append(listToJSON(null, 0, (List<?>) obj));
        } else if (obj instanceof Map) {
            json.append(mapToJSON((Map<?, ?>) obj));
        } else if (obj instanceof Set) {
            json.append(setToJson((Set<?>) obj));
        } else if (obj instanceof Date) {
        	if("Timestamp".equals(obj.getClass().getSimpleName())){
        		
        		Timestamp tm = (Timestamp)obj;
        		
        		json.append("\"").append(timestampToJSON((Date)obj)).append("\"");
        	}else if("Time".equals(obj.getClass().getSimpleName())){
        		Time tm=(Time)obj;
        		json.append("\"").append(timeToJSON((Date)obj)).append("\"");
        	}else{
        		json.append("\"").append(dateToJSON((Date)obj)).append("\"");
        	}
        }else {
            json.append(beanToJSON(obj));
        }
        return json.toString();
    }

    /**
     * beanToJsonOnly 专用
     * @param obj Object对象
     * @return String
     */
    private static String objectToJSONforbeanToJSONOnly(Object obj) {
        StringBuilder json = new StringBuilder();
        if (obj == null) {
            json.append("");
        } else if (obj instanceof Number) {
            json.append(numberToJSON((Number) obj));
        } else if (obj instanceof Boolean) {
            json.append(booleanToJSON((Boolean) obj));
        } else if (obj instanceof String) {
            json.append("").append(stringToJson(obj.toString())).append("");
        } else if (obj instanceof Object[]) {
            json.append(arrayToJSON((Object[]) obj));
        } else if (obj instanceof List) {
            json.append(listToJSON(null, 0, (List<?>) obj));
        } else if (obj instanceof Map) {
            json.append(mapToJSON((Map<?, ?>) obj));
        } else if (obj instanceof Set) {
            json.append(setToJson((Set<?>) obj));
        } else if (obj instanceof Date) {
            json.append("").append(dateToJSON((Date)obj)).append("");
        }else {
            json.append(beanToJSONOnly(null,obj));
        }
        return json.toString();
    }
    /**
     * @param set
     *            集合对象
     * @return String
     */
    public static String setToJson(Set<?> set) {
        StringBuilder json = new StringBuilder();
        json.append("{");
        if (set != null && set.size() > 0) {
            for (Object obj : set) {
                json.append(objectToJSON(obj));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, '}');
        } else {
            json.append("}");
        }
        return json.toString();
    }
    /***
     * 从一个json格式的字符串数组来得到json数组
     * @param jStrings JSON格式字符串
     * @return JSONArray
     */
    public static JSONArray stringArrayToJSONArray(String[] jStrings){
    	JSONArray jArray = new JSONArray();
    	JSONObject jobject = null;
    	for(int i = 0 ; i<jStrings.length;i++){
    		jobject = JSONObject.fromObject(jStrings[i]);
    		jArray.add(jobject);
    		jobject.clear();
    	}
    	return jArray;
    }
    
    /**
     * 通过传入的JSONArray格式的字符串得到JSONObject
     * @param jString SONArray格式
     * @param index 位于JSONArray中JSONObject的位置
     * @return JSONObject
     */
    public static JSONObject stringArrayToJSONObject(String[] jString,int index){
    	JSONObject jsObject = new JSONObject();
    	JSONArray jArray = stringArrayToJSONArray(jString);
    	jsObject = (JSONObject)jArray.get(index);
    	return jsObject;
    }
    
    /***
	 * 字符转换Json字符串
	 * @param s 
	 * @return String
	 */
    private static String stringToJson(String s) {
        if (s == null) {
            return nullToJson();
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            switch (ch) {
            case '"':
                sb.append("\\\"");
                break;
            case '\\':
                sb.append("\\\\");
                break;
            case '\b':
                sb.append("\\b");
                break;
            case '\f':
                sb.append("\\f");
                break;
            case '\n':
                sb.append("\\n");
                break;
            case '\r':
                sb.append("\\r");
                break;
            case '\t':
                sb.append("\\t");
                break;
            case '/':
                sb.append("\\/");
                break;
            default:
                if (ch >= '\u0000' && ch <= '\u001F') {
                    String ss = Integer.toHexString(ch);
                    sb.append("\\u");
                    for (int k = 0; k < S_LEN - ss.length(); k++) {
                        sb.append('0');
                    }
                    sb.append(ss.toUpperCase());
                } else {
                    sb.append(ch);
                }
            }
        }
        return sb.toString();
    }
    
    /**
     * 将JSONObject格式的字符串转换成指定的对象返回
     * @param jsonString
     *            JSONObject格式的字符串
     * @param pojoCalss
     *            转换后的对象类型
     * @return 转换后的对象
     */

    public static Object jsonToObject(String jsonString, Class<?> pojoCalss) {
        Object pojo;
        JSONObject jsonObject = JSONObject.fromObject(jsonString);
        pojo = JSONObject.toBean(jsonObject, pojoCalss);
        return pojo;
    }

    /**
     * 将JSONObject格式的字符串转换成Map<String,Object>对象返回
     * 
     * @param jsonString
     *            需要进行转换的JSONObject格式字符串
     * @return 转换后的Map<String,Object>对象
     */
    public static Map<String, Object> jsonToMap(String jsonString) {
        /*JSONObject jsonObject = JSONObject.fromObject(jsonString);
        Iterator<?> keyIter = jsonObject.keys();
        String key;
        Object value;
        Map<String, Object> valueMap = new HashMap<String, Object>();
        while (keyIter.hasNext()) {
            key = (String) keyIter.next();
            value = jsonObject.get(key);
            valueMap.put(key, value);
        }*/
    	Type type = new TypeToken<Map<String,Object>>(){}.getType();
    	GsonBuilder gb = new GsonBuilder();
		Gson gson = gb.create();
    	Map<String, Object> valueMap = gson.fromJson(jsonString, type);
        return valueMap;
    }

    /**
     * 将JSONArray格式的字符串转换成对象数组返回
     * 
     * @param jsonString
     *            需要进行转换的JSONArray格式字符串
     * @return 转换后的对象数组
     */
    public static Object[] jsonToObjectArray(String jsonString) {
        JSONArray jsonArray = JSONArray.fromObject(jsonString);
        return jsonArray.toArray();
    }

    /**
     * 将JSONArray格式的字符串转换成指定对象组成的List返回
     * 
     * @param jsonString
     *            JSONArray格式的字符串
     * @param pojoClass
     *            转换后的List中对象类型
     * @return 转换后的List对象
     */
    public static List<Object> jsonToList(String jsonString, Class<?> pojoClass) {
        JSONArray jsonArray = JSONArray.fromObject(jsonString);
        JSONObject jsonObject;
        Object pojoValue;
        List<Object> list = new ArrayList<Object>();
        for (int i = 0; i < jsonArray.size(); i++) {
            jsonObject = jsonArray.getJSONObject(i);
            pojoValue = JSONObject.toBean(jsonObject, pojoClass);
            list.add(pojoValue);
        }
        return list;
    }

    /**
     * 将JSONArray格式的字符串转换成字符串数组返回
     * 
     * @param jsonString
     *            需要进行转换的JSONArray格式字符串
     * @return 转换后的字符串数组
     */
    public static String[] jsonToStringArray(String jsonString) {
        JSONArray jsonArray = JSONArray.fromObject(jsonString);
        String[] stringArray = new String[jsonArray.size()];
        for (int i = 0; i < jsonArray.size(); i++) {
            stringArray[i] = jsonArray.getString(i);
        }
        return stringArray;
    }

}
